/**
sigpending(sigset_t set)
是返回未决的信号到信号集sigset_t 中去
此函数的功能是:
先将SIGRTMIN＋10阻塞，然后取得未决信号集，判断此信号是否在其中，再解除阻塞
打开终端在另外一个shell中利用ps aux查看当前进程的进程号, 并发送kill -44 pid
**/
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

void myhandler(int signo,siginfo_t *si,void *ucontext);

int main()
{
	struct sigaction oldact,act;
	sigset_t oldmask,newmask,pendingmask;
	act.sa_sigaction=myhandler;
	act.sa_flags=SA_SIGINFO;
	sigemptyset(&act.sa_mask);//首先将阻塞集合设置为空，即不阻塞任何信号
	//注册信号处理函数
	sigaction(SIGRTMIN+10,&act,&oldact);

	//开始阻塞
	sigemptyset(&newmask);
	sigaddset(&newmask,SIGRTMIN+10);
	printf("SIGRTMIN+10 blocked\n");
	sigprocmask(SIG_BLOCK,&newmask,&oldmask);
	sleep(20);//为了发出信号

	printf("now begin to get pending mask\n");
	if(sigpending(&pendingmask)<0){
		perror("pendingmask error");
	}
	printf( "Pending set is %8.8ld.\n", pendingmask );

	if(sigismember(&pendingmask,SIGRTMIN+10)){
		printf("SIGRTMIN+10 is in the pending mask\n");
	}

	sigprocmask(SIG_UNBLOCK,&newmask,&oldmask);
	printf("SIGRTMIN+10 unblocked\n");

}
//信号处理函数
void myhandler(int signo,siginfo_t *si,void *ucontext){
	printf("receive signal %d\n",si->si_signo);
}

